<?php

class Listas_Model_Escalas extends Model_Cna {
	
	public function __construct() {
		parent::__construct();
	}
	
	/**
	 * Ejecuta validaciones den los datos de una escala de gradación para verificar
	 * que sea adecuada para su almacenamiento.
	 * Lanza excepciones si encuentra errores.
	 * @param array $datos
	 */
	public function validarEscalasGradacion(array $datos) {
		//Zend_Debug::dump($datos);
		$numerico_todos = true;
		$numerico_alguno = false;
		//Primero se verifica si los valores de gradacion numericos fueron diligenciados
		//total o parcialmente o ninguno
		$nombres = array("pesoinferior", "pesosuperior", "porcentajeinferior", "porcentajesuperior");
		foreach ($nombres as $value) {
    		if($datos[$value] != "") {
    		    $numerico_alguno = true;
    		}
		    if($datos[$value] == "") {
    		    $numerico_todos = false;
    		}
		}
		
	    if($datos["gradononumerico"]=="" && !$numerico_alguno) {
	        throw new Exception("Debe diligenciar por lo menos un valor de gradación (numérico o no numérico)");
	    }
	    
	    if($datos["gradononumerico"]!="" && !$numerico_alguno) {
	        return;
	    }
	    
	    if(!$numerico_todos) {
	        throw new Exception("Debe diligenciar todos los valores de gradación no numérico");
	    }
	}
	
	/**
	 * Método para crear las escalas necesarias para las listas
	 * de completitud
	 * @param integer $codlista
	 */
	function crearEscalasCompletitud($codlista) {
	    $escalasTable = new Listas_Model_DbTable_Escalas();
	    
		$datos = array();
		$datos["codlista"] = $codlista;
		$datos["nombre"] = "Si";
		$datos["peso"] = 100;
				
	    $escalasTable->createRow($datos)->save();
	    
	    $datos["nombre"] = "No";
		$datos["peso"] = 0;
		
		$escalasTable->createRow($datos)->save();
	}
	
	/**
	 * Obtiene los criterios/escalas definidos para una lista de valoración
	 * ordenada por peso
	 * @param integer $codlista
	 * @return array
	 */
	public function getEscalasValoracion($codlista) {
		$escalasTable = new Listas_Model_DbTable_Escalas();
		return $escalasTable->getEscalasValoracion($codlista);
	}
	
	/**
	 * Obtiene los criterios/escalas definidos para una lista de valoración
	 * ordenada por peso
	 * @param integer $codlista
	 * @return array
	 */
	public function getEscalasDiligencia($codlista,$codproceso="") {
	    $array_escalas = array();
		$escalasTable = new Listas_Model_DbTable_Escalas();
		$escalas =  $escalasTable->getEscalasValoracion($codlista,$codproceso);
		foreach($escalas as $key => $valor){
		    $rango = "";
		    if (!empty($valor["pesoinferior"])) $rango = " - ({$valor["pesoinferior"]} - {$valor["pesosuperior"]})";
		    $gradononumerico = "";
		    if (!empty($valor["gradononumerico"])) $gradononumerico = "{$valor["gradononumerico"]}. ";
		    
		    $array_escalas[$valor["codescala"]]= $gradononumerico.$valor["nombre"].$rango;
		}
		return $array_escalas;
	}
	
	/**
	 * Obtiene los datos de una escala
	 * @param Integer $codescala Código de la escala
	 * @return Array datos de la escala
	 */
    public function getEscala($codescala) {
        $escalasTable = new Listas_Model_DbTable_Escalas();
		return $escalasTable->find($codescala)->current()->toArray();
	}
	
	/**
	 * Guardar los datos de una escala para una lista
	 * @param array $datos
	 * @return integer la llave primaria de la escala creada o modificada
	 */
	public function guardarEscala(array $datos) {
	    $escalasTable = new Listas_Model_DbTable_Escalas();
	    if(!empty($datos["codescala"])) {
			return $escalasTable->find($datos["codescala"])->current()->setFromArray($datos)->save();
		} else {
		    unset($datos["codescala"]);
		    return $escalasTable->createRow($this->forceEmptyAsNull($datos))->save();
		}
	}
	
    public function eliminarEscala($codescala) {
        $escalasTable = new Listas_Model_DbTable_Escalas();
		return $escalasTable->find($codescala)->current()->delete();
	}
	
	/**
	 * Eliminas todas las escalas asociadas a un elementolista
	 * @param int $codelementolista
	 */
    public function deleteEscalasByElemento($codelementolista) {
        $escalasTable = new Listas_Model_DbTable_Escalas();
		return $escalasTable->deleteEscalasByElemento($codelementolista);
	}
	
	/**
	 * Obtiene las escalas asignadas a un elemento
	 * @param int $codelementolista
	 */
	public function getEscalasByElemento($codelementolista) {
	    $escalasTable = new Listas_Model_DbTable_Escalas();
		return $escalasTable->getEscalasByElemento($codelementolista);
	}
	
	/**
	 * Obtiene los registros de las escalas de gradación asociadas a una lista
	 * para un proceso especifico
	 * @param int $codlista
	 * @param int $codproceso
	 * @return array
	 */
	public function getEscalasGradacionProceso($codlista, $codproceso) {
	    $escalasTable = new Listas_Model_DbTable_Escalas();
	    return $escalasTable->fetchAll("codlista={$codlista} AND codproceso={$codproceso}", "pesoinferior")->toArray();
	}
	
	/**
	 * Obtiene la cantidad de registros de las escalas de gradación asociadas a una lista
	 * para un proceso especifico
	 * @param int $codlista
	 * @param int $codproceso
	 * @return Integer Cantidad de registros
	 */
	public function getCountEscalasGradacionProceso($codlista, $codproceso) {
	   // $escalasTable = new Listas_Model_DbTable_Escalas();
	   // $escalas = $escalasTable->fetchAll("codlista={$codlista} AND codproceso={$codproceso}", "pesoinferior")->toArray();
	   $escalas = $this->getEscalasGradacionProceso($codlista, $codproceso, $tipo="I");
	    return count($escalas);
	}
	/**
	 * Valida que valor digitado en la valoración se encuentre dentro del rango definido
	 * @param Integer $codescala
	 * @param Integer $valoracion
	 * @return Booleam
	 */
	public function validargrado($codescala,$valoracion) {
	     $datos_escala = $this->getEscala($codescala);
	     if ( (floatval($datos_escala["pesoinferior"])> floatval($valoracion)) ||
	          (floatval($valoracion)>floatval($datos_escala["pesosuperior"])))
	         return false;
	     return true;
	}
	
	/**
	 * Obtiene el código de la escalas de gradación asociadas a una lista
	 * que se encuentre dentro del rango de peso del peso consultado
	 * @param Integer $codlista Código de la lista
	 * @param Float $valorpeso Valor a buscar
	 * @return Integer $codescala Código de la escala
	 */
	public function getEscalaGradacionValorPeso($codlista, $valorpeso) {
	    $escalasTable = new Listas_Model_DbTable_Escalas();
	    return $escalasTable->getEscalaGradacionValorPeso($codlista, $valorpeso);
	}
	
}//fin de la clase